package com.jxin.mall.member.manager;

import com.jxin.mall.entity.entity.GlobalRsp;
import com.jxin.mall.member.domain.consts.AllianceTypeEnum;
import com.jxin.mall.member.domain.entity.LoginHistory;
import com.jxin.mall.member.domain.entity.MemberUser;
import com.jxin.mall.member.service.entity.dto.req.UserLoginReqDTO;
import com.jxin.mall.member.service.entity.dto.req.UserRegisterReqDTO;

/**
 * 会员登入注册管理类接口
 * @author 蔡佳新
 * @version 1.0
 * @since jdk 1.8
 */
public interface LoginRegisterManager {
    /**
     * 会员注册,根据手机号码
     * @param  userRegisterReqDTO 注册参数
     * @return 全局响应参数
     * @author 蔡佳新
     */
    GlobalRsp registerByPhone(UserRegisterReqDTO userRegisterReqDTO);

    /**
     * 会员注册,根据账号
     * @param  userRegisterReqDTO 注册参数
     * @return 全局响应参数
     * @author 蔡佳新
     */
    GlobalRsp registerByUsername(UserRegisterReqDTO userRegisterReqDTO);
    /**
     * 唯一登录
     * 1.插入新的登入历史记录
     * 2.失效当前启用的登入历史记录
     * 3.删除当前启用的登入历史记录的redis的token
     * @param  userLoginReqDTO 登入参数
     * @param  memberUser      用户实例
     * @return 当前登入的令牌
     * @author 蔡佳新
     */
    String onlyOneLogin(MemberUser memberUser, UserLoginReqDTO userLoginReqDTO);
    /**
     * 失效登入历史,并清除对应token
     * @param  loginHistory 登录历史
     * @author 蔡佳新
     */
    void disableTokenAndHistory(LoginHistory loginHistory);
    /**
     * 检验注册码是否正确
     * @param  phone        电话
     * @param  registerCode 注册码
     * @return 如果注册码校验不通过,返回 {@link GlobalRsp}。通过则返回<code>null</code>
     */
    GlobalRsp registerCodeVerify(String phone, String registerCode);
    /**
     * 微信联合登入
     * @param  accessToken 微信公总号授权登入令牌
     * @param  loginType   登录类型
     * @return 微信用户实例
     * @author 蔡佳新
     */
    GlobalRsp<String> wxAllianceLogin(String accessToken, String loginType);

    /**
     * 获取微信授权地址
     * @param  backUrl 回调地址
     * @return 全局响应参数
     * @author 蔡佳新
     */
    GlobalRsp getWxAccessUrl(String backUrl);

    /**
     * 用户关联联合登录编码
     * @param  code         关联编码
     * @param  userId       用户Id
     * @param  allianceType 联合类型
     * @return 如果更新失败则返回 异常全局参数,成功则返回 <code>null</code>
     */
    GlobalRsp userRelevancyCode(String code, Integer userId, AllianceTypeEnum allianceType);
}
